﻿Imports System.ComponentModel
Imports System.Text

''' <summary>
''' 
''' </summary>
''' <remarks>Let op: zoeken via sneltoets F10 moet in het formulier zelf afgehandeld worden</remarks>
Public Class ZoekArtikelCriteriaControl

    Public Enum VoorraadType
        InVoorraad
        NietInVoorraad
        OmHetEven
        Niets
    End Enum

    Private _laatDozenToe As Boolean = True

#Region "Public property's"

    Public Property Prijs() As Nullable(Of Decimal)
        Get
            Dim strPrijs As String = tbPrijs.Text.Trim()
            If (strPrijs = String.Empty) Then Return Nothing
            Dim deprijs As Decimal
            If (Decimal.TryParse(strPrijs, deprijs)) Then
                Return deprijs
            Else
                Return Nothing
            End If
        End Get
        Set(ByVal value As Nullable(Of Decimal))
            If (value Is Nothing) Then
                tbPrijs.Text = String.Empty
            Else
                tbPrijs.Text = value.ToString()
            End If
        End Set
    End Property

    Public Property Omschrijving() As String
        Get
            Return tbOmschrijving.Text.Trim()
        End Get
        Set(ByVal value As String)
            tbOmschrijving.Text = value
        End Set
    End Property

    Public Property ArtikelCode() As String
        Get
            Return tbArtikelcode.Text.Trim()
        End Get
        Set(ByVal value As String)
            tbArtikelcode.Text = value
        End Set
    End Property

    Public Property BarCode() As String
        Get
            Return tbBarcode.Text.Trim()
        End Get
        Set(ByVal value As String)
            tbBarcode.Text = value
        End Set
    End Property

    Public Property InVoorraad() As VoorraadType
        Get
            If (cbInVoorraad.Checked) Then
                If (cbNietInVoorraad.Checked) Then
                    Return VoorraadType.OmHetEven
                Else
                    Return VoorraadType.InVoorraad
                End If
            Else
                If (cbNietInVoorraad.Checked) Then
                    Return VoorraadType.NietInVoorraad
                Else
                    Return VoorraadType.Niets
                End If
            End If
        End Get
        Set(ByVal value As VoorraadType)
            cbInVoorraad.Checked = (value = VoorraadType.InVoorraad) Or (value = VoorraadType.OmHetEven)
            cbNietInVoorraad.Checked = (value = VoorraadType.NietInVoorraad) Or (value = VoorraadType.OmHetEven)
        End Set
    End Property

    Public Property NietInVoorraad() As Boolean
        Get
            Return cbNietInVoorraad.Checked
        End Get
        Set(ByVal value As Boolean)
            cbNietInVoorraad.Checked = value
        End Set
    End Property

    Public Property Titel() As String
        Get
            Return GroupBox1.Text
        End Get
        Set(ByVal value As String)
            GroupBox1.Text = value
        End Set
    End Property

    Public Property ZoekKnopText() As String
        Get
            Return btnZoeken.Text
        End Get
        Set(ByVal value As String)
            btnZoeken.Text = value
        End Set
    End Property

    <Category("FairShop"), DefaultValue(True)> _
    Public Property LaatDozenToe() As Boolean
        Get
            Return _laatDozenToe
        End Get
        Set(ByVal value As Boolean)
            _laatDozenToe = value
        End Set
    End Property

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <value></value>
    ''' <returns>String met filter voor artikels. Deze kan gebruikt worden als filter op een DataView op de tabel Artikels.
    ''' Nothing indien er geen criteria ingevuld zijn.</returns>
    ''' <remarks>Roep altijd eerst ValidateChildren() aan vooraleer je het ArtikelFilter opvraagt.</remarks>
    Public ReadOnly Property ArtikelFilter() As String
        Get
            Dim prijs As Nullable(Of Decimal) = Me.Prijs
            If (Me.Omschrijving = "" AndAlso Me.ArtikelCode = "" _
                    AndAlso Me.BarCode = "" AndAlso prijs Is Nothing) Then
                Return Nothing
            End If
            Dim sb As New StringBuilder()
            sb.Append("1 = 1")
            If (Not String.IsNullOrEmpty(Me.Omschrijving)) Then
                Dim woorden As String() = Me.Omschrijving.Split(" "c)
                For Each woord As String In woorden
                    sb.Append(String.Format(" AND Omschrijving LIKE '%{0}%'", woord))
                Next
            End If
            sb.Append(String.Format(" AND ArtikelCode LIKE '%{0}%'", Me.ArtikelCode))
            sb.Append(String.Format(" AND Barcode LIKE '%{0}%'", Me.BarCode))
            If (prijs IsNot Nothing) Then
                sb.Append(String.Format(" AND Prijs = {0}", prijs.ToString().Replace(",", ".")))
            End If
            Select Case Me.InVoorraad
                Case ZoekArtikelCriteriaControl.VoorraadType.InVoorraad
                    sb.Append(" AND Voorraad>0")
                Case ZoekArtikelCriteriaControl.VoorraadType.NietInVoorraad
                    sb.Append(" AND Voorraad<=0")
                Case ZoekArtikelCriteriaControl.VoorraadType.Niets
                    ' Zorg ervoor dat er niets getoond wordt (anders verwarrend).
                    ' Misschien beter onmogelijk maken om beide af te checken?
                    sb.Append(" AND 0=1")
                Case ZoekArtikelCriteriaControl.VoorraadType.OmHetEven
                    ' Niets doen, want alles mag
            End Select
            If (Not LaatDozenToe) Then
                sb.Append(String.Format(" AND ArtikelCode NOT LIKE '{0}%'", Constants.DOOS_PREFIX))
            End If
            Return sb.ToString()
        End Get
    End Property

#End Region

#Region "Events"

    Public Event Zoeken(ByVal sender As Object, ByVal e As EventArgs)

    Private Sub btnZoeken_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnZoeken.Click
        RaiseEvent Zoeken(Me, e)
    End Sub

#End Region

#Region "Public methods"

    Public Overrides Function ValidateChildren() As Boolean
        Me.ErrorProvider1.Clear()
        Dim strPrijs As String = tbPrijs.Text.Trim()
        Dim deprijs As Decimal
        If (strPrijs <> String.Empty AndAlso Not Decimal.TryParse(strPrijs, deprijs)) Then
            Me.ErrorProvider1.SetError(tbPrijs, "Geen geldige prijs ingevuld")
            Return False
        End If
        Return MyBase.ValidateChildren()
    End Function

#End Region

End Class
